﻿using RS.Echarts.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media;
using System.Windows.Media.Animation;

namespace RS.ZhaoXiWidgets.echarts
{
    /// <summary>
    /// 表示ECharts图表的图例组件配置类。
    /// </summary>
    public class Legend
    {
        /// <summary>
        /// 图例的类型，可选值为"plain"（普通图例）或"scroll"（可滚动翻页的图例）。
        /// </summary>
        public string Type { get; set; } = "plain";

        /// <summary>
        /// 组件ID，默认不指定，指定后可用于在option或者API中引用组件。
        /// </summary>
        public string Id { get; set; }

        /// <summary>
        /// 是否显示图例组件，默认为true。
        /// </summary>
        public bool Show { get; set; } = true;

        /// <summary>
        /// 所有图形的zlevel值，用于Canvas分层。
        /// </summary>
        public int Zlevel { get; set; }

        /// <summary>
        /// 组件的所有图形的z值，控制图形的前后顺序。
        /// </summary>
        public int Z { get; set; } = 2;

        /// <summary>
        /// 图例组件离容器左侧的距离，可以是具体像素值、相对于容器高宽的百分比或'left'、'center'、'right'。
        /// 如果值为'left'、'center'、'right'，组件会根据相应的位置自动对齐。
        /// </summary>
        public string Left { get; set; } = "auto";

        /// <summary>
        /// 图例组件离容器上侧的距离，可以是具体像素值、相对于容器高宽的百分比或'top'、'middle'、'bottom'。
        /// 如果值为'top'、'middle'、'bottom'，组件会根据相应的位置自动对齐。
        /// </summary>
        public string Top { get; set; } = "auto";

        /// <summary>
        /// 图例组件离容器右侧的距离，可以是具体像素值、相对于容器高宽的百分比。默认自适应。
        /// </summary>
        public string Right { get; set; } = "auto";

        /// <summary>
        /// 图例组件离容器下侧的距离，可以是具体像素值、相对于容器高宽的百分比。默认自适应。
        /// </summary>
        public string Bottom { get; set; } = "auto";

        /// <summary>
        /// 图例组件的宽度，默认自适应。
        /// </summary>
        public string Width { get; set; } = "auto";

        /// <summary>
        /// 图例组件的高度，默认自适应。
        /// </summary>
        public string Height { get; set; } = "auto";

        /// <summary>
        /// 图例列表的布局朝向，可选值为'horizontal'（水平）或'vertical'（垂直）。
        /// </summary>
        public string Orient { get; set; } = "horizontal";

        /// <summary>
        /// 图例标记和文本的对齐方式，可选值为'auto'（自动）、'left'（左对齐）、'right'（右对齐）。
        /// </summary>
        public string Align { get; set; } = "auto";

        /// <summary>
        /// 图例内边距，单位px，默认各方向内边距为5，接受数组分别设定上右下左边距。
        /// 例如：{ 5, 5, 5, 5 }表示上下左右内边距均为5px；{ 5, 10 }表示上下内边距为5px，左右内边距为10px；{ 5, 10, 5, 15 }表示上内边距为5px，右内边距为10px，下内边距为5px，左内边距为15px。
        /// </summary>
        public int[] Padding { get; set; } = new int[] { 5, 5, 5, 5 };

        /// <summary>
        /// 图例每项之间的间隔。横向布局时为水平间隔，纵向布局时为纵向间隔。
        /// </summary>
        public int ItemGap { get; set; } = 10;

        /// <summary>
        /// 图例标记的图形宽度。
        /// </summary>
        public int ItemWidth { get; set; } = 25;

        /// <summary>
        /// 图例标记的图形高度。
        /// </summary>
        public int ItemHeight { get; set; } = 14;

        /// <summary>
        /// 图例的图形样式配置。
        /// </summary>
        public LegendSymbolStyle ItemStyle { get; set; } = new LegendSymbolStyle();

        /// <summary>
        /// 图例图形中线的样式配置。
        /// </summary>
        public LineStyle LineStyle { get; set; } = new LineStyle();

        /// <summary>
        /// 图形旋转角度，类型为number | 'inherit'。如果为'inherit'，表示取系列的symbolRotate。
        /// </summary>
        public object SymbolRotate { get; set; } = "inherit";

        /// <summary>
        /// 用来格式化图例文本，支持字符串模板和回调函数两种形式。
        /// </summary>
        public object Formatter { get; set; }

        /// <summary>
        /// 图例选择的模式，控制是否可以通过点击图例改变系列的显示状态。默认开启图例选择，可以设成false关闭。
        /// 除此之外也可以设成'single'（单选）或者'multiple'（多选）模式。
        /// </summary>
        public string SelectedMode { get; set; } = "true";

        /// <summary>
        /// 图例关闭时的颜色。
        /// </summary>
        public Color InactiveColor { get; set; } = Color.FromArgb(255,204, 204, 204);

        /// <summary>
        /// 图例关闭时的描边颜色。
        /// </summary>
        public Color InactiveBorderColor { get; set; } = Color.FromArgb(255, 204, 204, 204);

        /// <summary>
        /// 图例关闭时的描边粗细。
        /// 如果为'auto'表示：如果系列存在描边，则取2，如果系列不存在描边，则取0。
        /// 如果为'inherit'表示：始终取系列的描边粗细。
        /// </summary>
        public object InactiveBorderWidth { get; set; } = "auto";

        /// <summary>
        /// 图例选中状态表。
        /// </summary>
        public Dictionary<string, bool> Selected { get; set; } = new Dictionary<string, bool>();

        /// <summary>
        /// 图例的公用文本样式配置。
        /// </summary>
        public TextStyle TextStyle { get; set; } = new TextStyle();

        /// <summary>
        /// 图例的tooltip配置，配置项同tooltip。默认不显示。
        /// </summary>
        public ToolTip Tooltip { get; set; } = new ToolTip();

        /// <summary>
        /// 图例项的icon，可选值包括'circle'、'rect'、'roundRect'、'triangle'、'diamond'、'pin'、'arrow'、'none'，
        /// 也可以通过'image://url'设置为图片（URL为图片链接或dataURI），或者通过'path://'设置为任意的矢量路径。
        /// </summary>
        public string Icon { get; set; }

        /// <summary>
        /// 图例的数据数组。数组项通常为一个字符串，每一项代表一个系列的name（如果是饼图，也可以是饼图单个数据的name）。
        /// 图例组件会自动根据对应系列的图形标记（symbol）来绘制自己的颜色和标记，特殊字符串''（空字符串）或者'\n'（换行字符串）用于图例的换行。
        /// 如果data没有被指定，会自动从当前系列中获取。多数系列会取自series.name或者series.encode的seriesName所指定的维度。如饼图和漏斗图等会取自series.data中的name。
        /// 如果要设置单独一项的样式，也可以把该项写成配置项对象。此时必须使用name属性对应表示系列的name。
        /// </summary>
        public List<LegendDataItem> Data { get; set; } = new List<LegendDataItem>();

        /// <summary>
        /// 图例背景色，默认透明。
        /// </summary>
        public Color BackgroundColor { get; set; } = Colors.Transparent;

        /// <summary>
        /// 图例的边框颜色。支持的颜色格式同backgroundColor。
        /// </summary>
        public Color BorderColor { get; set; } = Color.FromArgb(255, 204, 204, 204);

        /// <summary>
        /// 图例的边框线宽。
        /// </summary>
        public int BorderWidth { get; set; } = 1;

        /// <summary>
        /// 圆角半径，单位px，支持传入数组分别指定4个圆角半径。
        /// 例如：5表示统一设置四个角的圆角大小为5px；{ 5, 5, 0, 0 }表示（顺时针左上，右上，右下，左下）四个角的圆角半径分别为5px、5px、0px、0px。
        /// </summary>
        public int[] BorderRadius { get; set; }

        /// <summary>
        /// 图形阴影的模糊大小。该属性配合shadowColor、shadowOffsetX和shadowOffsetY一起设置图形的阴影效果。
        /// 注意：此配置项生效的前提是，设置了Show为true以及值不为'transparent'的背景色BackgroundColor。
        /// </summary>
        public int ShadowBlur { get; set; }

        /// <summary>
        /// 阴影颜色。支持的格式同Color。注意：此配置项生效的前提是，设置了Show为true。
        /// </summary>
        public Color ShadowColor { get; set; }

        /// <summary>
        /// 阴影水平方向上的偏移距离。注意：此配置项生效的前提是，设置了Show为true。
        /// </summary>
        public int ShadowOffsetX { get; set; }

        /// <summary>
        /// 阴影垂直方向上的偏移距离。注意：此配置项生效的前提是，设置了Show为true。
        /// </summary>
        public int ShadowOffsetY { get; set; }

        /// <summary>
        /// legend.type为'scroll'时有效。图例当前最左上显示项的dataIndex。
        /// setOption时指定此项的话，可决定当前图例滚动到哪里。
        /// 但是，如果仅仅想改变图例翻页，一般并不调用setOption（因为这太重量了），仅仅使用action legendScroll即可。
        /// </summary>
        public int ScrollDataIndex { get; set; }

        /// <summary>
        /// legend.type为'scroll'时有效。图例控制块中，按钮和页信息之间的间隔。
        /// </summary>
        public int PageButtonItemGap { get; set; } = 5;

        /// <summary>
        /// legend.type为'scroll'时有效。图例控制块和图例项之间的间隔。
        /// </summary>
        public int PageButtonGap { get; set; }

        /// <summary>
        /// legend.type为'scroll'时有效。图例控制块的位置，可选值为'start'（控制块在左或上）或'end'（控制块在右或下）。
        /// </summary>
        public string PageButtonPosition { get; set; } = "end";

        /// <summary>
        /// legend.type为'scroll'时有效。图例控制块中，页信息的显示格式。默认为'{current}/{total}'，其中{current}是当前页号（从1开始计数），{total}是总页数。
        /// 如果pageFormatter使用函数，须返回字符串，参数为：{ current: number, total: number }。
        /// </summary>
        public object PageFormatter { get; set; } = "{current}/{total}";

        /// <summary>
        /// legend.type为'scroll'时有效。图例控制块的图标配置。
        /// </summary>
        public ScrollIcons PageIcons { get; set; } = new ScrollIcons();

        /// <summary>
        /// legend.type为'scroll'时有效。翻页按钮的颜色。
        /// </summary>
        public string PageIconColor { get; set; } = "#2f4554";

        /// <summary>
        /// legend.type为'scroll'时有效。翻页按钮不激活时（即翻页到头时）的颜色。
        /// </summary>
        public string PageIconInactiveColor { get; set; } = "#aaa";

        /// <summary>
        /// legend.type为'scroll'时有效。翻页按钮的大小。可以是数字，也可以是数组，如[10, 3]，表示[宽，高]。
        /// </summary>
        public object PageIconSize { get; set; } = 15;

        /// <summary>
        /// legend.type为'scroll'时有效。图例页信息的文字样式配置。
        /// </summary>
        public TextStyle PageTextStyle { get; set; } = new TextStyle();

        /// <summary>
        /// 图例翻页是否使用动画。
        /// </summary>
        public bool Animation { get; set; }

        /// <summary>
        /// 图例翻页时的动画时长。
        /// </summary>
        public int AnimationDurationUpdate { get; set; } = 800;

        /// <summary>
        /// 从v4.4.0开始支持。图例组件中的选择器按钮，目前包括“全选”和“反选”两种功能。默认不显示，用户可手动开启，也可以手动配置每个按钮的标题。
        /// </summary>
        public List<SelectorButton> Selector { get; set; }

        /// <summary>
        /// 从v4.4.0开始支持。选择器按钮的文本标签样式配置。
        /// </summary>
        public SelectorLabelStyle SelectorLabel { get; set; } = new SelectorLabelStyle();

        /// <summary>
        /// 从v4.4.0开始支持。选择器的位置，可以放在图例的尾部或者头部，对应的值分别为'end'和'start'。
        /// 默认情况下，图例横向布局的时候，选择器放在图例的尾部；图例纵向布局的时候，选择器放在图例的头部。
        /// </summary>
        public string SelectorPosition { get; set; } = "auto";

        /// <summary>
        /// 从v4.4.0开始支持。选择器按钮之间的间隔。
        /// </summary>
        public int SelectorItemGap { get; set; } = 7;

        /// <summary>
        /// 从v4.4.0开始支持。选择器按钮与图例组件之间的间隔。
        /// </summary>
        public int SelectorButtonGap { get; set; } = 10;
    }
}
